#ifndef __LIST_H_
#define __LIST_H_

#include <iostream>
#include <stddef.h>
using ElementType = int;

class List
{
public:
    List();
    List(const List& l);
    List& operator=(const List& l);
    ~List();

    void InsertTail(const ElementType& element);
    void InsertHead(const ElementType& element);
    void InsertByIndex(size_t index,const ElementType& element);

    void RemoveByIndex(size_t index);
    void RemoveByElement(const ElementType& element);

    ElementType* FindByIndex(size_t index);

    void UpdateByIndex(size_t index,const ElementType& element);
    void UpdateByElement(const ElementType& oldvalue,const ElementType& newvalue);

    //排序
    void BuubleSort();
    void Sort();
    //倒数第n个元素
    ElementType* GetReserveIndex(size_t index);
    //归并
    List Merge(const List& list);
    //交并补
    //取交集
    List FdIntrSctn(const List& list);
    //取并集
    List FindUnionSet(const List& list);
    //取补集
    List FindDifference(const List& list);
    //链表的逆序
    void Reserve();
    //递归逆序
    void Reserve2();

    void show();

private:
    struct Node
    {
        Node(const ElementType& value)
        {
            this->value = value;
            next = nullptr;
        }
        ElementType value;
        Node* next;
    };
    size_t size;
    Node* head;

    void FastSort(Node *start ,Node *end);
    Node *reserve(Node *node);

};


#endif